//package com.learn.test;
//
//import cn.hutool.core.util.StrUtil;
//import org.I0Itec.zkclient.IZkDataListener;
//import org.I0Itec.zkclient.ZkClient;
//
//import java.util.Collections;
//import java.util.List;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.locks.Condition;
//import java.util.concurrent.locks.Lock;
//
///**
// * @author shenkaiwen5
// * @version 1.0
// * @date 2021-07-07
// */
//public class MyZk implements Lock {
//
//    private static final String IP_PORT = "127.0.0.1:2181";
//    private static final String Z_NODE = "/LOCK";
//
//    private volatile String path;
//    private volatile String beforePath;
//
//    private CountDownLatch cdl = new CountDownLatch(1);
//
//    private ZkClient zkClient;
//
//    public MyZk() {
//        zkClient = new ZkClient(IP_PORT);
//    }
//
//    @Override
//    public void lock() {
//        //尝试加锁
//        if (tryLock()) {
//            System.out.println("加锁成功");
//        } else {
//            //进入等待，监听
//            waitForLock();
//            //再次尝试
//            lock();
//        }
//    }
//
//    @Override
//    public synchronized boolean tryLock() {
//        // 第一次就进来创建自己的临时节点
//        if (path == null || StrUtil.isBlank(path)) {
//            path = zkClient.createEphemeralSequential(Z_NODE + "/", "lock");
//        }
//        List<String> children = zkClient.getChildren(Z_NODE);
//        Collections.sort(children);
//        //如果临时节点是第一个，则加锁成功
//        if (path.equals(Z_NODE + "/" + children.get(0))) {
//            return true;
//        }
//        //如果临时节点不是第一个，获取前一个节点
//        int i = Collections.binarySearch(children, path.substring(Z_NODE.length() + 1));
//        beforePath = Z_NODE + "/" + children.get(i-1);
//
//        return false;
//    }
//
//    private void waitForLock()  {
//        IZkDataListener listener = new IZkDataListener() {
//            @Override
//            public void handleDataChange(String s, Object o) throws Exception {
//
//            }
//
//            @Override
//            public void handleDataDeleted(String s) throws Exception {
//                System.out.println("【" + Thread.currentThread().getName() + "】 ：监听到删除事件！——————————————————");
//                cdl.countDown();
//            }
//        };
//        //监听
//        zkClient.subscribeDataChanges(beforePath, listener);
//
//        if (zkClient.exists(beforePath)) {
//            try {
//                System.out.println("加锁失败，监听等待");
//                cdl.await();
//                cdl = new CountDownLatch(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//        //释放监听
//        zkClient.unsubscribeDataChanges(beforePath, listener);
//    }
//
//    @Override
//    public void unlock() {
//        zkClient.delete(path);
//    }
//
//    @Override
//    public void lockInterruptibly() throws InterruptedException {
//
//    }
//
//    @Override
//    public Condition newCondition() {
//        return null;
//    }
//
//    @Override
//    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
//        return false;
//    }
//}
